package park.model.thing;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;

import park.model.description.TabelaPreco;
import park.model.description.TipoVeiculo;
import park.model.moment_interval.Estada;
/**
 * @archetype party-place-thing
 * @author gilberto
 * @since 22/04/2009
 */
public class Veiculo implements Serializable {
	private static final long serialVersionUID = 1L;
	/*
	 * References TipoVeiculo class. 
	 * Note: 
	 * 	- the real state of this realacionship is tipo;
	 *  - the lookup data is TipoVeiculo 
	 */
	private String tipo;
	private transient TipoVeiculo tipoVeiculo;
	/*
	 * References TabelaPreco class. 
	 * Note: 
	 * 	- the real state of this realacionship is cdTabelaPreco;
	 *  - the lookup data is TabelaPreco 
	 */
	private Integer cdTabelaPreco;
	private transient TabelaPreco tabelaPreco;

	private String placa;
	private String cor;
	/*
	 * Veiculo can have zero or more Estadas 
	 */
	private Collection<Estada> estadas = new HashSet<Estada>();
	
	public Veiculo(){}

	public Veiculo(String placa, String cor, String tipo, Integer cdTabelaPreco) {
		this.placa = placa;
		this.cor = cor;
		this.tipo = tipo;
		this.cdTabelaPreco = cdTabelaPreco;
	}

	public Veiculo(String placa, String cor, TipoVeiculo tipoVeiculo, TabelaPreco tabelaPreco) {
		this.placa = placa;
		this.cor = cor;
		setTipoVeiculo(tipoVeiculo);
		setTabelaPreco(tabelaPreco);
	}
	public Veiculo(String placa, String cor, TipoVeiculo tipoVeiculo, TabelaPreco tabelaPreco, Estada estada) {
		this.placa = placa;
		this.cor = cor;
		setTipoVeiculo(tipoVeiculo);
		setTabelaPreco(tabelaPreco);
		addEstada(estada);		
	}	

	public String getTipo() {return tipo;}
	public void setTipo(String tipo) {this.tipo = tipo;}	
	public TipoVeiculo getTipoVeiculo() {return tipoVeiculo;}
	public void setTipoVeiculo(TipoVeiculo tipoVeiculo) {
		this.tipoVeiculo = tipoVeiculo;
		this.tipo = tipoVeiculo.getTipo();
	}	
	public Integer getCdTabelaPreco() {return cdTabelaPreco;}
	public void setCdTabelaPreco(Integer cdTabelaPreco) {this.cdTabelaPreco = cdTabelaPreco;}	
	public TabelaPreco getTabelaPreco() {return tabelaPreco;}
	public void setTabelaPreco(TabelaPreco tabelaPreco) {
		this.tabelaPreco = tabelaPreco;
		this.cdTabelaPreco = tabelaPreco.getCdTabelaPreco();
	}
	public void setEstadas(Collection<Estada> estadas) {this.estadas = estadas;}
	public Collection<Estada> getEstadas() {return estadas;}
	public void addEstada(Estada estada){estadas.add(estada);}	
	public String getPlaca() {return placa;}
	public void setPlaca(String placa) {this.placa = placa;}
	public String getCor() {return cor;}
	public void setCor(String cor) {this.cor = cor;}

	@Override
	public boolean equals(final Object other) {
		if (this == other)
			return true;
		if (!(other instanceof Veiculo))
			return false;
		Veiculo castOther = (Veiculo) other;
		return new EqualsBuilder()
				.append(tipo, castOther.tipo)
			    //.append(tipoVeiculo, castOther.tipoVeiculo)  transient field
				.append(cdTabelaPreco, castOther.cdTabelaPreco)
			    //.append(TabelaPreco, castOther.tabelaPreco)  transient field
				//.append(estadas, castOther.estadas)  collection field
				.append(placa, castOther.placa)
				.append(cor,castOther.cor).isEquals();
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder()
				.append(tipo)
				//.append(tipoVeiculo)  transient field
				.append(cdTabelaPreco)
				//.append(tabelaPreco)  transient field
				//.append(estadas)  collection field
				.append(placa)
				.append(cor).toHashCode();
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
				.appendSuper(super.toString())
				.append("tipo", tipo)
				//.append("tipoVeiculo",tipoVeiculo)  transient field
				.append("cdTabelaPreco", cdTabelaPreco)
				//.append("tabelaPreco",tabelaPreco)  transient field
				//.append("estadas", estadas)  collection field
				.append("placa", placa)
				.append("cor", cor).toString();
	}

}
